package cn.iocoder.yudao.module.system.service.wishlist;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.wishlist.vo.UserWishListCreateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.wishlist.vo.UserWishListPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.wishlist.vo.UserWishListUpdateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.wishlist.vo.UserWishListWithScoreRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.wishlist.UserWishListDO;

import javax.validation.Valid;
import java.util.List;

/**
 * 用户志愿表 Service 接口
 *
 * @author 芋道源码
 */
public interface UserWishListService {

    /**
     * 创建用户志愿表
     *
     * @param createReqVO 创建信息
     * @param userId 用户ID
     * @return 编号
     */
    Long createUserWishList(@Valid UserWishListCreateReqVO createReqVO, Long userId);

    /**
     * 更新用户志愿表
     *
     * @param updateReqVO 更新信息
     * @param userId 用户ID
     */
    void updateUserWishList(@Valid UserWishListUpdateReqVO updateReqVO, Long userId);

    /**
     * 删除用户志愿表
     *
     * @param id 编号
     * @param userId 用户ID
     */
    void deleteUserWishList(Long id, Long userId);

    /**
     * 获得用户志愿表
     *
     * @param id 编号
     * @param userId 用户ID
     * @return 用户志愿表
     */
    UserWishListDO getUserWishList(Long id, Long userId);

    /**
     * 获得用户志愿表分页
     *
     * @param pageReqVO 分页查询
     * @return 用户志愿表分页
     */
    PageResult<UserWishListDO> getUserWishListPage(UserWishListPageReqVO pageReqVO);

    /**
     * 导出用户志愿表为Excel文件并返回下载链接
     *
     * @param pageReqVO 查询条件
     * @param userId 用户ID
     * @return 文件下载链接
     */
    String exportUserWishListToFile(UserWishListPageReqVO pageReqVO, Long userId);

    /**
     * 获得用户的所有志愿表
     *
     * @param userId 用户ID
     * @return 用户志愿表列表
     */
    List<UserWishListDO> getUserWishListByUserId(Long userId);

    /**
     * 获得用户指定类型的志愿表
     *
     * @param userId 用户ID
     * @param wishType 志愿类型
     * @return 用户志愿表列表
     */
    List<UserWishListDO> getUserWishListByUserIdAndWishType(Long userId, String wishType);

    /**
     * 检查用户是否已经添加了该专业
     *
     * @param userId 用户ID
     * @param schoolUuid 学校UUID
     * @param majorName 专业名称
     * @param year 年份
     * @return 是否已存在
     */
    boolean isWishListExists(Long userId, String schoolUuid, String majorName, Integer year);

    /**
     * 更新志愿顺序
     *
     * @param userId 用户ID
     * @param wishType 志愿类型
     * @param wishListIds 志愿ID列表（按新顺序排列）
     */
    void updateWishOrder(Long userId, String wishType, List<Long> wishListIds);

    /**
     * 获取用户指定类型志愿的数量
     *
     * @param userId 用户ID
     * @param wishType 志愿类型
     * @return 数量
     */
    Long getWishListCountByUserIdAndWishType(Long userId, String wishType);

    /**
     * 检测用户基本信息是否发生变更，如果变更则清空已有志愿
     *
     * @param userId 用户ID
     * @param userProvince 用户当前省份
     * @param userTotalScore 用户当前总分
     * @param userSubjectSelection 用户当前选科
     * @param userYear 用户当前年份
     * @return 是否发生了变更并清空了志愿
     */
    boolean checkAndClearWishListIfUserInfoChanged(Long userId, String userProvince, Integer userTotalScore,
                                                   String userSubjectSelection, Integer userYear);

    /**
     * 根据用户ID和条件获取志愿表数量
     *
     * @param userId 用户ID
     * @param userProvince 用户省份
     * @param userSubjectSelection 用户科目选择
     * @param userTotalScore 用户总分
     * @return 志愿表数量
     */
    Long getWishListCountByUserIdAndConditions(Long userId, String userProvince, String userSubjectSelection, Integer userTotalScore);

    /**
     * 获得用户志愿表（包含成绩信息）
     *
     * @param id 编号
     * @param userId 用户ID
     * @return 用户志愿表（包含成绩信息）
     */
    UserWishListWithScoreRespVO getUserWishListWithScore(Long id, Long userId);

    /**
     * 获得用户志愿表列表（包含成绩信息）
     *
     * @param userId 用户ID
     * @return 用户志愿表列表（包含成绩信息）
     */
    List<UserWishListWithScoreRespVO> getUserWishListWithScoreByUserId(Long userId);

    /**
     * 获得用户志愿表分页（包含成绩信息）
     *
     * @param pageReqVO 分页查询
     * @return 用户志愿表分页（包含成绩信息）
     */
    PageResult<UserWishListWithScoreRespVO> getUserWishListWithScorePage(UserWishListPageReqVO pageReqVO);

    /**
     * 验证用户成绩记录
     *
     * @param userScoreId 成绩记录ID
     * @param userId 用户ID
     * @return 验证通过的成绩记录
     */
    cn.iocoder.yudao.module.system.dal.dataobject.user.UserScoresDO validateUserScore(Long userScoreId, Long userId);

}
